home *** CD-ROM | disk | FTP | other *** search
/ Popular Request / By Popular Request (Arsenal Computer)(SysOptics Distribution System).ISO / amiga4 / sclk1_72.lha / SClock / Source / digital.c < prev    next >
C/C++ Source or Header  |  1993-12-26  |  6KB  |  283 lines

  1. /****************************************************************************
  2. *
  3. * VERSION
  4. *    $VER: digital.c 1.60 (03.12.93)
  5. *
  6. * DESCRIPTION
  7. *    The code for the digital clock...
  8. *
  9. * AUTHOR
  10. *    Rune Johnsrud
  11. *
  12. * COPYRIGHT
  13. *    (c) 1993 Amiga Freelancers
  14. *
  15. *****************************************************************************/
  16.  
  17. #define INTUI_V36_NAMES_ONLY
  18.  
  19. #include <exec/types.h>
  20. #include <utility/date.h>
  21.  
  22. #include <proto/graphics.h>
  23. #include <proto/intuition.h>
  24. #include <proto/diskfont.h>
  25. #include <proto/gadtools.h>
  26.  
  27. #include "global.h"
  28.  
  29. /************************************************************************/
  30.  
  31. extern struct GlobalData *gd;
  32. extern struct ClockInfo *ci;
  33. extern struct Gadget ClockGadget;
  34.  
  35. /************************************************************************/
  36.  
  37. UBYTE *Numbers[] =
  38. {
  39.     "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
  40. };
  41.  
  42. UBYTE *Months[] =
  43. {
  44.     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  45.     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
  46. };
  47.  
  48. UWORD DateChars[] =
  49. {
  50.     11,        /* dd.mmm.yyyy    */
  51.      9,        /* dd.mmm.yy    */
  52.     10,        /* dd.mm.yyyy    */
  53.      8,        /* dd.mm.yy        */
  54. };
  55.  
  56. /************************************************************************/
  57.  
  58. static VOID CalcWinDims(VOID);
  59. WORD CreateDigitalClock(VOID);
  60. VOID RefreshDigitalClock(VOID);
  61. WORD DeleteDigitalClock(VOID);
  62.  
  63. /************************************************************************/
  64.  
  65.  
  66. static VOID CalcWinDims(VOID)
  67. {
  68.     UBYTE a;
  69.     UWORD tx = 0, cw = 0, mw = 0, tsw = 0, dsw = 0;
  70.  
  71.     SetFont(&gd->FakeRP, gd->TextFont);
  72.  
  73.     ci->InnerHeight = gd->TextFont->tf_YSize + 2;
  74.  
  75.     for (a=0; a<10; a++)
  76.     {
  77.         tx = TextLength(&gd->FakeRP, Numbers[a], 1);
  78.         if (tx > cw) cw = tx;
  79.     }
  80.  
  81.     for (a=0; a<12; a++)
  82.     {
  83.         tx = TextLength(&gd->FakeRP, Months[a], 3);
  84.         if (tx > mw) mw = tx;
  85.     }
  86.  
  87.     tsw = TextLength(&gd->FakeRP, ci->TimeSep, 1);
  88.     dsw = TextLength(&gd->FakeRP, ci->DateSep, 1);
  89.  
  90.     if (ci->ShowSec)
  91.     {
  92.         ci->InnerWidth = ((cw * 6) + (tsw * 2) + 6);
  93.     }
  94.     else
  95.     {
  96.         ci->InnerWidth = ((cw * 4) + tsw + 6);
  97.     }
  98.  
  99.     ci->TimeWidth = ci->InnerWidth;
  100.  
  101.     if (ci->ShowDate)
  102.     {
  103.         ci->InnerWidth += ((dsw * 2) + (ci->DateSpc * cw));
  104.  
  105.         switch (ci->DateFormat)
  106.         {
  107.         case 0:
  108.             tx = (mw + (cw * 6));
  109.             break;
  110.         case 1:
  111.             tx = (mw + (cw * 4));
  112.             break;
  113.         case 2:
  114.             tx = (cw * 8);
  115.             break;
  116.         case 3:
  117.             tx = (cw * 6);
  118.             break;
  119.         }
  120.  
  121.         ci->InnerWidth += tx;
  122.     }
  123.  
  124.     if (ci->InnerWidth > gd->VScreen->Width)
  125.     {
  126.         ci->InnerWidth = ci->TimeWidth;
  127.         ci->ShowDate   = FALSE;
  128.  
  129.         Error("SClock", GEN_ERR_WINSIZE);
  130.     }
  131. }
  132.  
  133.  
  134. WORD CreateDigitalClock(VOID)
  135. {
  136.     struct Gadget *g = &ClockGadget;
  137.     struct RastPort *rp;
  138.  
  139.     if (gd->ClockWindow) CleanUpClock();
  140.  
  141.     gd->TextFont = OpenDiskFont(&gd->TextAttr);
  142.     if (!gd->TextFont) return GEN_ERR_OPENFONT;
  143.  
  144.     gd->VScreen = LockPubScreen(ci->PubScreenName);
  145.     if (!gd->VScreen) return GEN_ERR_LOCKSCREEN;
  146.  
  147.     gd->VisualInfo = GetVisualInfo(gd->VScreen, NULL);
  148.     if (!gd->VisualInfo) return GEN_ERR_GETVISUALINFO;
  149.  
  150.     CalcWinDims();
  151.  
  152.     gd->ClockWindow = OpenWindowTags(NULL,
  153.                         WA_PubScreen,    gd->VScreen,
  154.                         WA_Top,            ci->Top,
  155.                         WA_Left,        ci->Left,
  156.                         WA_InnerWidth,    ci->InnerWidth,
  157.                         WA_InnerHeight,    ci->InnerHeight,
  158.                         WA_Activate,    TRUE,
  159.                         WA_Borderless,    TRUE,
  160.                         WA_Backdrop,    ci->BDClock,
  161.                         WA_DragBar,        FALSE,
  162.                         WA_NewLookMenus,TRUE,
  163.                         WA_IDCMP,        IDCMP_MENUPICK,
  164.                         TAG_DONE);
  165.  
  166.     if (!gd->ClockWindow) return GEN_ERR_OPENWINDOW;
  167.     if (!InitMainMenus()) return GEN_ERR_MENUS;
  168.  
  169.     if (gd->VScreen)
  170.     {
  171.         UnlockPubScreen(NULL, gd->VScreen);
  172.         gd->VScreen = NULL;
  173.     }
  174.  
  175.     ci->InnerWidth--;
  176.     ci->InnerHeight--;
  177.  
  178.     g->Width          = ci->InnerWidth;
  179.     g->Height         = ci->InnerHeight;
  180.     gd->ClockGadget = g;
  181.     rp                 = gd->ClockWindow->RPort;
  182.  
  183.     gd->FillRP = *rp;
  184.     SetAPen(&gd->FillRP, ci->BGPen);
  185.  
  186.     SetAPen(rp, ci->BGPen);
  187.     RectFill(rp, 0, 0, ci->InnerWidth, ci->InnerHeight);
  188.  
  189.     if (ci->WinBevel)
  190.     {
  191.         SetAPen(rp, ci->ShinePen);
  192.         Move(rp, 0, ci->InnerHeight);
  193.         Draw(rp, 0, 0);
  194.         Draw(rp, ci->InnerWidth, 0);
  195.  
  196.         SetAPen(rp, ci->ShadowPen);
  197.         Move(rp, ci->InnerWidth, 1);
  198.         Draw(rp, ci->InnerWidth, ci->InnerHeight);
  199.         Draw(rp, 0, ci->InnerHeight);
  200.     }
  201.  
  202.     SetABPenDrMd(rp, ci->TextPen, ci->BGPen, JAM2);
  203.     SetFont(rp, gd->TextFont);
  204.  
  205.     gd->CData.year    = 0;
  206.     gd->CData.month    = 0;
  207.     gd->CData.mday    = 0;
  208.     gd->CData.hour    = 99;
  209.     gd->CData.min    = 99;
  210.     gd->CData.sec    = 99;
  211.  
  212.     RefreshDigitalClock();
  213.  
  214.     AddGadget   (gd->ClockWindow, gd->ClockGadget, -1);
  215.     RefreshGList(gd->ClockGadget, gd->ClockWindow, NULL, -1);
  216.  
  217.     return NOERROR;
  218. }
  219.  
  220.  
  221. VOID RefreshDigitalClock(VOID)
  222. {
  223.     struct RastPort *rp = gd->ClockWindow->RPort;
  224.     UWORD x = 0;
  225.  
  226.     GetCurrSysTime();
  227.  
  228.     if (gd->NewTime)
  229.     {
  230.         if (ci->ShowSec) x = 8; else x = 5;
  231.  
  232.         Move(rp, 3, gd->TextFont->tf_Baseline + 1);
  233.         Text(rp, gd->TimeStr, x);
  234.  
  235.         if (rp->cp_x <= (ci->TimeWidth - 1))
  236.         {
  237.             RectFill(&gd->FillRP, rp->cp_x, 1, ci->TimeWidth - 2, ci->InnerHeight - 1);
  238.         }
  239.  
  240.         gd->NewTime = FALSE;
  241.     }
  242.     
  243.     if ((ci->ShowDate) && (gd->NewDate))
  244.     {
  245.         RectFill(&gd->FillRP, rp->cp_x, 1, ci->InnerWidth - 1, ci->InnerHeight - 1);
  246.  
  247.         x = TextLength(rp, gd->DateStr, DateChars[ci->DateFormat]);
  248.  
  249.         Move(rp, (ci->InnerWidth - x - 2), gd->TextFont->tf_Baseline + 1);
  250.         Text(rp, gd->DateStr, DateChars[ci->DateFormat]);
  251.  
  252.         gd->NewDate = FALSE;
  253.     }
  254. }
  255.  
  256.  
  257. WORD DeleteDigitalClock(VOID)
  258. {
  259.     ci->Top  = gd->ClockWindow->TopEdge;
  260.     ci->Left = gd->ClockWindow->LeftEdge;
  261.  
  262.     if (gd->VScreen)     UnlockPubScreen(NULL, gd->VScreen);
  263.     if (gd->ClockGadget) RemoveGadget(gd->ClockWindow, gd->ClockGadget);
  264.     if (gd->TextFont)    CloseFont(gd->TextFont);
  265.     if (gd->ClockWindow) ClearMenuStrip(gd->ClockWindow);
  266.     if (gd->MainMenu)     FreeMenus(gd->MainMenu);
  267.     if (gd->VisualInfo)     FreeVisualInfo(gd->VisualInfo);
  268.     if (gd->ClockWindow) CloseWindow(gd->ClockWindow);
  269.  
  270.     gd->VScreen     = NULL;
  271.     gd->ClockGadget = NULL;
  272.     gd->VisualInfo  = NULL;
  273.     gd->MainMenu    = NULL;
  274.     gd->TextFont    = NULL;
  275.     gd->ClockWindow = NULL;
  276.  
  277.     ci->ShowDate    = gd->TmpFlags;
  278.  
  279.     return NOERROR;
  280. }
  281.  
  282. /* End Of File */
  283.